package reflection;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author yunfei.shang
 * @date 2018/03/26
 * @descreption JAVA反射机制是在运行状态中，对于任意一个类，都能够知道这个类的所有属性和方法；
 * 对于任意一个对象，都能够调用它的任意一个方法和属性；
 * 反射就是把java类中的各种成分映射成一个个的Java对象
 */
public class ReflectionDemo {
    public static void main(String[] args) {
        try {
            //使用反射获取Class对象
            Class helloClass = Class.forName("reflection.HelloReflection");
            //通过反射获取构造函数并实例化对象
            Object obj = helloClass.getConstructor().newInstance();
            //获取公有成员变量
            //Field field = helloClass.getField("helloStr");
            //获取私有成员变量
            Field field = helloClass.getDeclaredField("helloStr");
            //暴力反射，解除私有限定
            field.setAccessible(true);
            //获取属性值
            System.out.println(field.get(obj));
            //获取属性名
            System.out.println(field.getName());
            //获取函数（函数名，参数类型...）
            Method method = helloClass.getMethod("initHelloStr", String.class);
            //执行函数（实例化对象、输入参数)
            method.invoke(obj, "hello");
        } catch (ClassNotFoundException cex) {
            cex.printStackTrace();
        } catch (NoSuchMethodException nex) {
            nex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
